package be.ipl.finito.daoimpl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;

import be.ipl.finito.dao.PartieDao;
import be.ipl.finito.domaine.Grille;
import be.ipl.finito.domaine.Joueur;
import be.ipl.finito.domaine.Partie;
import be.ipl.finito.domaine.Partie.Etat;

@SuppressWarnings("serial")
@Stateless
public class PartieDaoImpl extends DaoImpl<Integer, Partie> implements PartieDao {

	@Override
	public List<Partie> listerPartieEnAttenteDeJoueur() {
		Etat etat = Etat.EN_ATTENTE;
		String queryString = "select p from Partie p where p.etat = ?1";
		return liste(queryString, etat);
	}
	
	@Override
	public List<Partie> listerPartieAbandonnerDunJoueur(Joueur j) {
		List<Partie> partiesAbandonnee = new ArrayList<Partie>();
		List<Partie> parties = super.lister();
		for (Partie partie : parties) {
			if(partie.getJoueurs().contains(j)){
				partiesAbandonnee.add(partie);
			}
		}
		return partiesAbandonnee;
	}

	@Override
	public List<Joueur> listerJoueurs(int id) {
		Partie partie = super.rechercher(id);
		return partie.getJoueurs();
	}

	@Override
	public int getStatVictoireJoueur(Joueur joueur) {
		int nbVictoire = 0;
		List<Partie> parties = super.lister();
		for (Partie partie : parties) {
			if(partie.getJoueurs().contains(joueur)){
				if(partie.getClassement() != null && partie.getClassement().get(0).getJoueur().equals(joueur)){
					nbVictoire++;
				}
			}
		}
		return nbVictoire;
	}

	@Override
	public int getStatDefaiteJoueur(Joueur joueur) {
		int nbDefaite = 0;
		List<Partie> parties = super.lister();
		for (Partie partie : parties) {
			if(partie.getJoueurs().contains(joueur)){
				if(partie.getClassement() != null && !partie.getClassement().get(0).getJoueur().equals(joueur)){
					nbDefaite++;
				}
			}
		}
		return nbDefaite;
	}

	@Override
	public int getPointsJoueur(Joueur joueur) {
		int points = 0;
		List<Partie> parties = super.lister();
		for (Partie partie : parties) {
			if(partie.getJoueurs().contains(joueur)){
				for (Grille grille : partie.getClassement()) {
					if(grille.getJoueur().equals(joueur)){
						points += grille.getScore();
					}
				}
			}
		}
		return points;
	}

	@Override
	public Partie chargerTout(int idPartie) {
		Partie partie = super.rechercher(idPartie);
		partie.getGrilles().size();
		for (Grille g : partie.getGrilles()) {
			g.getGrille().size();
		}
		partie.getJeton().size();
		partie.getJoueurs().size();
		
		return partie;
	}
}